package com.zjj.learn.designmodel.work.factory.abstract_factory;

public class AbstractFactoryTest {

    public static void main(String[] args) {
        //创建一个美式工厂
        AbstractFactory factory = new AmericaFactory();
        //生产美式咖啡
        Coffee coffee = factory.createCoffee();
        coffee.addMilk();
        coffee.addSugar();
        String coffeeName = coffee.getName();
        System.out.println("coffeeName = " + coffeeName);
        //生产美式甜点【抹茶慕斯】
        Dessert dessert = factory.createDessert();
        dessert.show();

        System.out.println("------------------------");
        //创建一个意大利工厂
        AbstractFactory factory1 = new ItalyFactory();
        //生产拿铁咖啡
        Coffee coffee1 = factory1.createCoffee();
        String coffee1Name = coffee1.getName();
        System.out.println("coffee1Name = " + coffee1Name);
        //生产意大利甜点【提拉米苏】
        Dessert dessert1 = factory1.createDessert();
        dessert1.show();

    }


    /**
     * 抽象工厂模式
     * 抽象工厂模式是一种创建型设计模式，它提供一个接口，用于创建与产品有关的对象簇，
     * 因而也被称为 ”工具箱“ 或 ”工具包”。抽象工厂允许客户端使用界面来创建一组相关的对象，而不需要指定它们的具体类。
     *
     * 工厂方法模式中考虑的是一类产品的生产，如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。
     * 有关工厂方法模式的详细介绍请查看：
     *
     * 这些工厂只生产同种类产品，同种类产品称为同等级产品，也就是说：工厂方法模式只考虑生产同等级的产品，
     * 但是在现实生活中许多工厂是综合型的工厂，能生产多等级（种类） 的产品，如电器厂既生产电视机又生产洗衣机或空调，
     * 大学既有软件专业又有生物专业等。
     *
     * 抽象工厂模式将考虑多等级产品的生产，将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。
     *
     * 抽象工厂模式通常由以下几种角色组成：
     *   1、抽象工厂 (Abstract Factory) ：定义了一个接口，用于创建不同种类的产品。
     *   2、具体工厂 (Concrete Factory) ：实现抽象工厂接口，并负责实例化产品。
     *   3、抽象产品 (Abstract Product) ：定义产品的基本属性和方法。
     *   4、具体产品 (Concrete Product) ：实现抽象产品接口，即给出具体的实现。
     *
     * 例如：在咖啡店中往往有很多甜品可以提供，不仅仅可以生产咖啡【Coffee，如美式、拿铁等等】，还可以生产甜品【Dessert，如提拉米苏、抹茶慕斯等等】。
     *      要是按照工厂方法的方式进行创建。需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类，很容易发生类爆炸情况。
     *      其中拿铁咖啡、美式咖啡是一个产品等级，都是咖啡；提拉米苏、抹茶慕斯也是一个产品等级；
     *      拿铁咖啡和提拉米苏是同一产品族（也就是都属于意大利风味），美式咖啡和抹茶慕斯是同一产品族（也就是都属于美式风味）
     *
     * 案例代码实现：
     * 1、创建抽象工厂接口【AbstractFactory】，里面提供生产咖啡和甜点的抽象方法
     * 2、创建抽象产品，咖啡【Coffee】和甜点【Dessert】抽象类
     * 3、创建具体产品类，具体的甜点【提拉米苏（TiLaMiSu）和抹茶慕斯（MoChaMuSi）】和具体的咖啡【拿铁（NatieCoffee）和美式（AmericaCoffee）】
     * 4、创建具体的工厂【美式风格工厂（AmericaFactory）和意大利风格工厂（ItalyFactory）】
     * 5、测试产品
     *
     * 详细案例请见：{@link com.zjj.learn.designmodel.work.factory.abstract_factory}
     **/
}
